home *** CD-ROM | disk | FTP | other *** search
/ Internet Info 1994 March / Internet Info CD-ROM (Walnut Creek) (March 1994).iso / networking / ip / ka9q / alpha.arc / FTP.C < prev    next >
C/C++ Source or Header  |  1988-02-16  |  3KB  |  149 lines

  1. /* Stuff common to both the FTP server and client */
  2. #include <stdio.h>
  3. #include "global.h"
  4. #include "mbuf.h"
  5. #include "netuser.h"
  6. #include "timer.h"
  7. #include "tcp.h"
  8. #include "ftp.h"
  9. #include "session.h"
  10.  
  11. /* FTP Data channel Receive upcall handler */
  12. void
  13. ftpdr(tcb,cnt)
  14. struct tcb *tcb;
  15. int16 cnt;
  16. {
  17.     register struct ftp *ftp;
  18.     struct mbuf *bp;
  19.     char c;
  20.  
  21.     ftp = (struct ftp *)tcb->user;
  22.     if(ftp->state != RECEIVING_STATE){
  23.         close_tcp(tcb);
  24.         return;
  25.     }
  26.     /* This will likely also generate an ACK with window rotation */
  27.     recv_tcp(tcb,&bp,cnt);
  28.  
  29. #if (defined(UNIX) || defined(MAC) || defined(AMIGA))
  30.     if(ftp->type == ASCII_TYPE){
  31.         while(pullup(&bp,&c,1) == 1){
  32.             if(c != '\r')
  33.                 putc(c,ftp->fp);
  34.         }
  35.         return;
  36.     }
  37. #endif
  38.     while(bp != NULLBUF){
  39.         if(bp->cnt != 0)
  40.             fwrite(bp->data,1,(unsigned)bp->cnt,ftp->fp);
  41.         bp = free_mbuf(bp);
  42.     }
  43. }
  44. /* FTP Data channel Transmit upcall handler */
  45. void
  46. ftpdt(tcb,cnt)
  47. struct tcb *tcb;
  48. int16 cnt;
  49. {
  50.     struct ftp *ftp;
  51.     struct mbuf *bp;
  52.     register char *cp;
  53.     register int c;
  54.     int eof_flag;
  55.  
  56.     ftp = (struct ftp *)tcb->user;
  57.     if(ftp->state != SENDING_STATE){
  58.         close_tcp(tcb);
  59.         return;
  60.     }
  61.     if((bp = alloc_mbuf(cnt)) == NULLBUF){
  62.         /* Hard to know what to do here */
  63.         return;
  64.     }
  65.     eof_flag = 0;
  66.     if(ftp->type == IMAGE_TYPE){
  67.         bp->cnt = fread(bp->data,1,cnt,ftp->fp);
  68.         if(bp->cnt != cnt)
  69.             eof_flag = 1;
  70.     } else {
  71.         cp = bp->data;
  72.         while(cnt > 1){
  73.             if((c = getc(ftp->fp)) == EOF){
  74.                 eof_flag=1;
  75.                 break;
  76.             }
  77. #if (defined(CPM) || defined(MSDOS))
  78.             /* ^Z is CP/M's text EOF marker, and it is sometimes used
  79.              * by MS-DOS editors too
  80.              */
  81.             if(c == CTLZ){
  82.                 eof_flag = 1;
  83.                 break;
  84.             }
  85. #endif
  86. #if (defined(UNIX) || defined(MAC) || defined(AMIGA))
  87.             if(c == '\n'){
  88.                 *cp++ = '\r';
  89.                 bp->cnt++;
  90.                 cnt--;
  91.             }
  92. #endif
  93.             *cp++ = c;
  94.             bp->cnt++;
  95.             cnt--;
  96.         }
  97.     }
  98.     if(bp->cnt != 0)
  99.         send_tcp(tcb,bp);
  100.     else
  101.         free_p(bp);
  102.  
  103.     if(eof_flag){    /* EOF seen */
  104.         fclose(ftp->fp);
  105.         ftp->fp = NULLFILE;
  106.         close_tcp(tcb);
  107.     }
  108. }
  109. /* Allocate an FTP control block */
  110. struct ftp *
  111. ftp_create(bufsize)
  112. unsigned bufsize;
  113. {
  114.     void ftp_delete();
  115.     register struct ftp *ftp;
  116.  
  117.     if((ftp = (struct ftp *)calloc(1,sizeof (struct ftp))) == NULLFTP)
  118.         return NULLFTP;
  119.     if(bufsize != 0 && (ftp->buf = malloc(bufsize)) == NULLCHAR){
  120.         ftp_delete(ftp);
  121.         return NULLFTP;
  122.     }
  123.     ftp->state = COMMAND_STATE;
  124.     ftp->type = ASCII_TYPE;    /* Default transfer type */
  125.     return ftp;
  126. }
  127. /* Free resources, delete control block */
  128. void
  129. ftp_delete(ftp)
  130. register struct ftp *ftp;
  131. {
  132.     if(ftp->fp != NULLFILE && ftp->fp != stdout)
  133.         fclose(ftp->fp);
  134.     if(ftp->data != NULLTCB)
  135.         del_tcp(ftp->data);
  136.     if(ftp->username != NULLCHAR)
  137.         free(ftp->username);
  138.     if(ftp->path != NULLCHAR)
  139.         free(ftp->path);
  140.     if(ftp->buf != NULLCHAR)
  141.         free(ftp->buf);
  142.     if(ftp->cd != NULLCHAR)
  143.         free(ftp->cd);
  144.     if(ftp->session != NULLSESSION)
  145.         freesession(ftp->session);
  146.     free((char *)ftp);
  147. }
  148.  
  149.